package com.zgjkhis.logging.service;

import com.zgjkhis.common.service.BaseService;
import com.zgjkhis.domain.PageResult;
import com.zgjkhis.logging.domain.LogEntity;
import com.zgjkhis.logging.service.dto.LogErrorDTO;
import com.zgjkhis.logging.service.dto.LogQueryCriteria;
import com.zgjkhis.logging.service.dto.LogSmallDTO;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.data.domain.Pageable;
import org.springframework.scheduling.annotation.Async;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

/**
 * @date 2018-11-24
 */
public interface LogService extends BaseService<LogEntity> {



    PageResult<LogEntity> findAllByPageable(String nickname, Pageable pageable);

    /**
     * 分页查询
     * @param criteria 查询条件
     * @param pageable 分页参数
     * @return /
     */
    PageResult<LogEntity> queryAll(LogQueryCriteria criteria, Pageable pageable);

    /**
     * 分页查询
     * @param criteria 查询条件
     * @param pageable 分页参数
     * @return /
     */
    PageResult<LogErrorDTO> queryAllError(LogQueryCriteria criteria, Pageable pageable);

    /**
     * 查询全部数据
     * @param criteria 查询条件
     * @return /
     */
    List<LogEntity> queryAll(LogQueryCriteria criteria);

    /**
     * 查询用户日志
     * @param criteria 查询条件
     * @param pageable 分页参数
     * @return -
     */
    PageResult<LogSmallDTO> queryAllByUser(LogQueryCriteria criteria, Pageable pageable);

    /**
     * 保存日志数据
     * @param username 用户
     * @param ip 请求IP
     * @param joinPoint /
     * @param logEntity 日志实体
     */
    @Async
    void save(String username, String ip, ProceedingJoinPoint joinPoint, LogEntity logEntity, Long uid);

    /**
     * 保存app日志数据
     * @param username 用户
     * @param ip 请求IP
     * @param joinPoint /
     * @param logEntity 日志实体
     */
    @Async
    void saveApp(String username, String ip, ProceedingJoinPoint joinPoint, LogEntity logEntity, Long uid);
    /**
     * 查询异常详情
     * @param id 日志ID
     * @return Object
     */
    Object findByErrDetail(Long id);

    /**
     * 导出日志
     * @param logEntities 待导出的数据
     * @param response /
     * @throws IOException /
     */
    void download(List<LogEntity> logEntities, HttpServletResponse response) throws IOException;

    /**
     * 删除所有错误日志
     */
    void delAllByError();

    /**
     * 删除所有INFO日志
     */
    void delAllByInfo();

    /**
     * 保存日志
     *
     * @param error
     * @param request
     * @param username
     * @param uid
     * @param type     0 管理后台 1 APP 2 微信小程序
     */
    @Async
    void saveError(Throwable error, HttpServletRequest request, String username, Long uid, Integer type);

}
